﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using TPDiseño.Clases_de_Control;
using TPDiseño.Clases_de_Entidad;
using TPDiseño.DTO_s;

namespace TPDiseño.Interfaces
{
    // Delegados
    public delegate void FinishEventHandler(object sender, System.EventArgs e); // Delegado encargado para manejar evento terminar

    public partial class EvaluarCand0 : Form
    {
        // Eventos
        public event FinishEventHandler terminar; // Evento terminar

        // Atributos
        /********************************************************************/
        // Gestores
        private Gestor_Candidato miGestorCandidato = new Gestor_Candidato();
        private Gestor_Cuestionario miGestorCuestionario = new Gestor_Cuestionario();
        
        // Objetos transitorios
        private List<Candidato> misCandidatosNoValidos;

        // objetos de salida que maneja el formulario
        private List<DTO_s.DTOCandidatoResult> misCandidatosParaEvaluar;
       
        public EvaluarCand0()
        {
            InitializeComponent();
        }


        // Administrador del evento termino
        public void termino(List<DTOCandidatoResult> candidatosListosParaEvaluar)
        {
            // Creo el DTOCandidatoClave con Argumentos...
            DTOCandidatoResultArgumentos e = new DTOCandidatoResultArgumentos(candidatosListosParaEvaluar);
            // Disparo el evento
            terminar(this, e);
        }

        private void Button_Buscar_Click_1(object sender, EventArgs e)
        {

            // Pimero limpio los resultados de la busqueda (para que no se mezclen busquedas)
            bindingSourceDTOResultCandidato.Clear();
            
            // Referencia a lista de candidatos
            List<Candidato> candidatosBuscados;

            candidatosBuscados = miGestorCandidato.buscar(this.TextBox_nombre.Text,
                                                          this.TextBox_apellido.Text,
                                                          this.TextBox_NCandidato.Text,
                                                          this.TextBox_Nempleado.Text
                                                         );
            //Recorro los candidatos buscados para agregarlos al biding de la grilla
            foreach (Candidato unCandidato in candidatosBuscados){
                // Agrego uno a uno al binding
                bindingSourceDTOResultCandidato.Add(new DTOCandidatoResult(unCandidato));
            }
            
        }

        private void Button_Limpiar_Click_1(object sender, EventArgs e)
        {
            this.TextBox_nombre.Text = "";
            this.TextBox_apellido.Text = "";
            this.TextBox_NCandidato.Text = "";
            this.TextBox_Nempleado.Text = "";
        }


        private void moverDeBusquedaAseleccionados(DataGridViewRow elementoEnGrillaParaMover)
        {
            // Agrego el elemento seleccionado al otro binding (el de los seleccionados)
            this.bindingSourcedtorDTOResultCandidatoSeleccionado.Add(elementoEnGrillaParaMover.DataBoundItem);
            // Finalmente lo quito del binding de busqueda
            this.bindingSourceDTOResultCandidato.Remove(elementoEnGrillaParaMover.DataBoundItem);
        }

        private void moverDeSeleccionadosABusqueda(DataGridViewRow elementoEnGrillaParaMover)
        {
            // Agrego el elemento seleccionado al otro binding (el de los seleccionados)
            this.bindingSourceDTOResultCandidato.Add(elementoEnGrillaParaMover.DataBoundItem);
            // Finalmente lo quito del binding de busqueda
            this.bindingSourcedtorDTOResultCandidatoSeleccionado.Remove(elementoEnGrillaParaMover.DataBoundItem);
        }

        private void moverTodosDeSeleccionadosABusqueda()
        {
            // Agrego el elemento seleccionado al otro binding (el de los seleccionados)
            foreach (object elemento in this.bindingSourcedtorDTOResultCandidatoSeleccionado.List)
            {
                this.bindingSourceDTOResultCandidato.Add(elemento);
            }
            // Finalmente lo quito del binding de busqueda
            bindingSourcedtorDTOResultCandidatoSeleccionado.Clear();
        }

        private void moverTodosDeBusquedaAseleccionados()
        {
            // Agrego el elemento seleccionado al otro binding (el de los seleccionados)

            // Finalmente lo quito del binding de busqueda
            foreach (object elemento in this.bindingSourceDTOResultCandidato.List){
                this.bindingSourcedtorDTOResultCandidatoSeleccionado.Add(elemento);
            }

            bindingSourceDTOResultCandidato.Clear();
        }
        
        
        private void Button_Agregar_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow seleccionada in this.DataGridView_resultadosBusqueda.SelectedRows)
            {
                moverDeBusquedaAseleccionados(seleccionada);
                
            }
        }

        private void Button_AgregarTodo_Click(object sender, EventArgs e)
        {
            moverTodosDeBusquedaAseleccionados();

        }

        private void Button_Quitar_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow seleccionada in this.DataGridView_candidatosSeleccionados.SelectedRows)
            {
                moverDeSeleccionadosABusqueda(seleccionada);

            }
        }


        private void Button_QuitarTodo_Click(object sender, EventArgs e)
        {
            moverTodosDeSeleccionadosABusqueda();
        }

        private void TextBox_apellido_TextChanged(object sender, EventArgs e)
        {
            panel1.Visible = true;

            //Validacion de Longitud y de Campo Obligatorio
            if (this.TextBox_apellido.TextLength == 25)
            {
                //Setea los colores de la legenda y carga las imagenes
                label_err_long.ForeColor = System.Drawing.Color.LimeGreen;
                label_err_obli.ForeColor = System.Drawing.Color.LimeGreen;
                pictureBox_long.Image = TPDiseño.Properties.Resources.tooltip_icon_valid;
                pictureBox_obli.Image = TPDiseño.Properties.Resources.tooltip_icon_valid;
                panel1.Tag = "1";

            }
            //Campo Codigo Vacio
            else if (this.TextBox_apellido.TextLength == 0)
            {
                //Setea los colores de la legenda y carga las imagenes
                label_err_obli.ForeColor = System.Drawing.Color.Red;
                pictureBox_long.Image = TPDiseño.Properties.Resources.tooltip_icon_error;
                pictureBox_obli.Image = TPDiseño.Properties.Resources.tooltip_icon_error;
                panel1.Tag = "0";
            }
            else
            {
                //Setea los colores de la legenda y carga las imagenes
                label_err_obli.ForeColor = System.Drawing.Color.LimeGreen;

                label_err_long.ForeColor = System.Drawing.Color.Red;
                pictureBox_obli.Image = TPDiseño.Properties.Resources.tooltip_icon_valid;
                pictureBox_long.Image = TPDiseño.Properties.Resources.tooltip_icon_error;
                panel1.Tag = "0";
            }

            //Imagen de validado o error!
            if (panel1.Tag == "0")
                pictureBoxCod.Image = TPDiseño.Properties.Resources.form_icon_error;
            else
                pictureBoxCod.Image = TPDiseño.Properties.Resources.form_icon_valid;
        }

        private void TextBox_apellido_KeyPress(object sender, KeyPressEventArgs e)
        {
            //No deja escribir si la tecla presionada es letra o simbolos
            panel1.Visible = true;
            label_err_Cod.Visible = false;
            label_err_extra.Visible = false;
            if (Char.IsLetter(e.KeyChar))
            {
                if (this.TextBox_apellido.TextLength == 25)
                {
                    e.Handled = true;
                }
                else
                {
                    e.Handled = false;
                    label_err_Cod.Visible = false;
                    label_err_extra.Visible = false;
                }

            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = true;

                if (this.TextBox_apellido.TextLength != 25)
                {
                    label_err_extra.Visible = true;
                    label_err_extra.ForeColor = System.Drawing.Color.Red;
                }
            }
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
            {
                e.Handled = true;
                if (this.TextBox_apellido.TextLength != 25)
                {
                    label_err_Cod.Visible = true;
                    label_err_Cod.ForeColor = System.Drawing.Color.Red;
                }

            }



        }

        private void label_err_long_Click(object sender, EventArgs e)
        {

        }

        private void Button_Siguiente_Click(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor; //cursor de espera
            // Si hay elementos en la lista de candidatos seleccionados
            if (bindingSourcedtorDTOResultCandidatoSeleccionado.List.Count > 0)
            {
                misCandidatosParaEvaluar = new List<DTOCandidatoResult>();
                misCandidatosNoValidos = new List<Candidato>();
                
                foreach (DTOCandidatoResult elemento in this.bindingSourcedtorDTOResultCandidatoSeleccionado.List)
                {
                    // Armo la lista de candiadatosClave para evaluar
                    this.misCandidatosParaEvaluar.Add(elemento);
                    // Armo la lista de candiadatos para validar (asu en principio que todos son invalidos)
                    this.misCandidatosNoValidos.Add(elemento.candidatoInstancia());
                }


                misCandidatosNoValidos = validarCandidatos(misCandidatosNoValidos);

                if (misCandidatosNoValidos.Count == 0)
                {

                    // Invoco el administrador del evento para que lo dispare !!
                    termino(misCandidatosParaEvaluar);
                }
                else
                {
                    String mensajeParaMostrar = "";

                    // Armo el mensaje de los candiadtos que no se pueden evaluar
                    foreach (Candidato unCandidato in misCandidatosNoValidos)
                    {
                        mensajeParaMostrar += "- " + unCandidato._nombre + " (" + unCandidato._nro_candidato.ToString() + ")\n";
                    }

                    // Muestro los candiadtos que no pueden ser evaluados
                    MessageBox.Show("Estos candidatos no puden ser evaluados por tener cuestionarios ACTIVOS o en PROCESO:" + "\n\n" + mensajeParaMostrar, "Candidatos no pueden ser evaluados");
                }
                              
                
               
            }
            else{//---------------------------------------------------------------------------

                MessageBox.Show("No hay candidatos seleccionados para ser evaluados");
            }

            Cursor.Current = Cursors.Default; //cursor normal
        }

        private List<Candidato> validarCandidatos(List<Candidato> misCandidatosParaEvaluar)
        {
            // Lista de candidatos no validos
            List<Candidato> candidatosNoValidados = new List<Candidato>();

            candidatosNoValidados = miGestorCandidato.cuestionariosActivosProceso(misCandidatosParaEvaluar);

            return candidatosNoValidados;

        }

        private void Button_Cancelar_Click(object sender, EventArgs e)
        {
            // Cierro el formulario
            this.Close();
        }

       

  }
}
